题目描述
原题
Description:
Given an input string (s) and a pattern (p), implement regular expression matching with support for ‘.’ and ‘‘.
‘.’ Matches any single character.
‘‘ Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).Note:
s could be empty and contains only lowercase letters a-z.
p could be empty and contains only lowercase letters a-z, and characters like . or *.Example 1:
Input:
s = “aa”
p = “a”Output: false
Explanation: “a” does not match the entire string “aa”.Example 2:
Input:
s = “aa”
p = “a*”Output: true
Explanation: ‘*’ means zero or more of the precedeng element, ‘a’. Therefore, by repeating ‘a’ once, it becomes “aa”.Example 3:
Input:
s = “ab”
p = “.*”Output: true
Explanation: “.*” means “zero or more (*) of any character (.)”.Example 4:
Input:
s = “aab”
p = “cab”Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches “aab”.Example 5:
Input:
s = “mississippi”
p = “misis*p.”Output: false
原题翻译
描述:
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 ‘.’ 和 ‘‘ 的正则表达式匹配。
‘.’ 匹配任意单个字符。
‘‘ 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。另外:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。例1:
输入:
s = “aa”
p = “a”输出: false
解释: “a” 无法匹配 “aa” 整个字符串。例2:
输入:
s = “aa”
p = “a*”输出: true
解释: ‘*’ 代表可匹配零个或多个前面的元素, 即可以匹配 ‘a’ 。因此, 重复 ‘a’ 一次, 字符串可变为 “aa”。例3:
输入:
s = “ab”
p = “.*”输出: true
解释: “.*” 表示可匹配零个或多个(‘*’)任意字符(‘.’)。例4:
输入:
s = “aab”
p = “cab”输出: true
解释: ‘c’ 可以不被重复, ‘a’ 可以被重复一次。因此可以匹配字符串 “aab”。例5:
输入:
s = “mississippi”
p = “misis*p.”输出: false
解法一
主要思想
递归地判断当前位置是否匹配。
运行速度:超过了14.44%的解答。
内存使用:超过了35.35%的解答。
源码
1 | public class Solution { |
解法二
主要思想
动态规划:自顶向下。
运行速度:超过了96.25%的解答。
内存使用:超过了100%的解答。
源码
1 | public class Solution { |
解法三
主要思想
动态规划:自下向上。
运行速度:超过了49.75%的解答。
内存使用:超过了100%的解答。
源码
1 | public class Solution { |
解法四
主要思想
- 如果p.charAt(j) == s.charAt(i),那么dp[i][j] = dp[i-1][j-1];
- 如果p.charAt(j) == ‘.’ ,那么dp[i][j] = dp[i-1][j-1];
- 如果p.charAt(j) == ‘*’,
(1) 如果p.charAt(j-1) != s.charAt(i),那么
1 | dp[i][j] = dp[i][j-2] // a*表示空(0个a) |
(2) 如果p.charAt(i-1) == s.charAt(i) 或者 p.charAt(i-1) == ‘.’,那么
1 | dp[i][j] = dp[i-1][j] // a*表示多个ass |
运行速度:超过了49.75%的解答。
内存使用:超过了100%的解答。
源码
1 | public class Solution { |